<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
/* 实现方案A 全局变量*/
        /* 解决思路：当我们第一次使用new来调用构造函数的时候，创建好实例对象后把这个对象保存起来，以后再需要调用该构造函数的时候，先检查是否已经创建过 */
        /* 如果这个实例对象已经创建过了，那么就不再创建新的，直接返回之前创建的那个对象。 */

        // let ins ;
        // function Person(){
        //     if(ins){
        //         return ins;
        //     }
        //     this.name = ins;
        //     ins= this;//创建好实例对象后把这个对象保存起来
        // }
        // let p1 = new Person();
        // let p2 = new Person();
        // console.log(p1);        
        // console.log(p2);        

        // ins = 123;
        // let p3 = new Person();
        // console.log(p3);
        
        /* 单例模式：某个类如果实现了单例模式那么这个类永远都只有一个实例对象，不管我们在哪里创建不管我们创建多少次返回的永远都是同一个对象。 */

        // function F() {
        //     return 123;//会忽略值类型的数据，总是返回内部新创建的实例对象
        //     // return [1,34,6];//数组不同于上面的值类型
        //   }
        //   console.log(new F);//默认返回内部新创建的实例对象
        
/*  实现方案B 静态属性 */

        //   function Person(){
        //       if(Person.ins){
        //           return Person.ins;
        //       }
        //       this.name = "ws";
        //       Person.ins = this;
        //   }
        //   let p1 = new Person();
        //   Person.ins = [10,30,35];
        //   let p2 = new Person();
        //   console.log(p1==p2);//false
          
  /* 解决方案C 闭包 */
          let Person = (function(){
              let ins;
              return function(){
                  if(ins){
                      return ins;
                  }
                  this.name = "ws";
                  ins = this;
              }
          })();

          let p1= new Person();
          let p2= new Person();

          console.log(p1);
          console.log(p2);
          
</script>
</html>